// // 可遍历类型 Map Set Object Array
// const typeMap = '[object Map]';
// const typeSet = '[object Set]';
// const typeObject = '[object Object]';
// const typeArray = '[object Array]';
// // 非原始类型的 不可遍历类型  Date RegExp Function
// const typeDate = '[object Date]';
// const typeRegExp = '[object RegExp]';
// const typeFunction = '[object Function]';

// const { reject } = require("lodash");

// // 非原始类型的 不可遍历类型的 集合（原始类型已经被过滤了不用再考虑了）
// const simpleType = [typeDate, typeRegExp, typeFunction];

// // 是否是引用类型
// const isObject = (target) => {
//     if (target === null) {
//         return false;
//     } else {
//         const type = typeof target;
//         return type === 'object' || type === 'function';
//     }
// };

// // 获取标准类型
// const getType = (target) => {
//     return Object.prototype.toString.call(target);
// };

// /*
// * 1、处理原始类型 Number String Boolean Symbol Null Undefined
// * 2、处理不可遍历类型 Date RegExp Function
// * 3、处理循环引用情况 WeakMap
// * 4、处理可遍历类型 Set Map Array Object
// * */
// const clone = (target, map = new Map()) => {
//     // debugger
//     // 处理原始类型直接返回(Number BigInt String Boolean Symbol Undefined Null)
//     if (!isObject(target)) {
//         return target;
//     }

//     // 处理不可遍历类型
//     const type = getType(target);
//     if (simpleType.includes(type)) {
//         switch (type) {
//             case typeDate:
//                 // 日期
//                 return new Date(target);
//             case typeRegExp:
//                 // 正则
//                 const reg = /\w*$/;
//                 const result = new RegExp(target.source, reg.exec(target)[0]);
//                 result.lastIndex = target.lastIndex; // lastIndex 表示每次匹配时的开始位置
//                 return result;
//             case typeFunction:
//                 // 函数
//                 return target;
//             default:
//                 return target;
//         }
//     }

//     // 用于返回
//     let cloneTarget;

//     // 处理循环引用
//     if (map.get(target)) {
//         // 已经放入过map的直接返回
//         return map.get(target)
//     }

//     // 处理可遍历类型
//     switch (type) {
//         case typeSet:
//             // Set
//             cloneTarget = new Set();
//             map.set(target, cloneTarget);
//             target.forEach((item) => {
//                 cloneTarget.add(clone(item, map))
//             });
//             return cloneTarget;
//         case typeMap:
//             // Map
//             cloneTarget = new Map();
//             map.set(target, cloneTarget);
//             target.forEach((value, key) => {
//                 cloneTarget.set(key, clone(value, map))
//             });
//             return cloneTarget;
//         case typeArray:
//             // 数组
//             cloneTarget = [];
//             map.set(target, cloneTarget);
//             target.forEach((item, index) => {
//                 cloneTarget[index] = clone(item, map)
//             });
//             return cloneTarget;
//         case typeObject:
//             // 对象
//             cloneTarget = {};
//             map.set(target, cloneTarget);
//             [...Object.keys(target), ...Object.getOwnPropertySymbols(target)].forEach((item) => {
//                 cloneTarget[item] = clone(target[item], map)
//             });
//             return cloneTarget;
//         default:
//             return target;
//     }
// };
// const target = {
//     field1: 1,
//     field2: {
//         child: 'dellyoung'
//     },
//     field3: [2, 4, 8]
// };
// target.target = clone(target);
// console.log(target)

// function ss (val) {
//   setTimeout(() => {
//     console.log(val)
//     console.log(this)
//   })
// }

// 懒加载监听
// function callback(e) {
//   // var data = document.getElementsByClassName('.div')
//   // if(e[0].intersectionRatio <= 0){
//   //   // 扩展div
//   //   console.log('callback')
//   //   var div = document.getElementsByClassName('div')[0]
//   //   div.style.height = (200 + parseInt(div.style.height)) + 'px'
//   // }
//   if (e[0].intersectionRatio > 0) {
//     console.log("call");
//   }
// }
// var data = document.querySelector(".div");
// var observer = new IntersectionObserver(callback);
// observer.observe(data);

// var text = 'hello1 hello2 hello3',
// pattern = /hello\d\s?/,
// globalPattern = /hello\d\s?/g,
// stickyPattern = /hello\d\s?/y,
// result = pattern.exec(text),
// globalResult = globalPattern.exec(text),
// stickyResult = stickyPattern.exec(text);

// console.log(result[0])
// console.log(globalResult[0])
// console.log(stickyResult[0])


// result = pattern.exec(text),
// globalResult = globalPattern.exec(text);
// stickyResult = stickyPattern.exec(text);
// console.log(pattern.lastIndex)
// console.log(globalPattern.lastIndex)
// console.log(stickyPattern.lastIndex)
// console.log(result[0])
// console.log(globalResult[0])
// console.log(stickyResult[0])

// console.log(pattern.lastIndex)
// console.log(globalPattern.lastIndex)
// console.log(stickyPattern.lastIndex)

// 变量临时死区
// console.log(v1);
// var v1 = 100;
// function foo() {
//   console.log(v1);
//   var v1 = 200;
//   console.log(v1);
// }
// foo();
// console.log(v1);

// 不定参数

// function pick(a, ...b){
//   console.log(a)
//   console.log(b)
// }
// pick('a', 'b', 'c', 'd')

// object get set
// var foo = (function(){
//   var o = {
//      a: 1,
//      b: 2,
//      /**更多属性**/
//   };
//   return function(key) {
//       return o[key];
//   }
// })();
// Object.defineProperty(Object.prototype, 'self', {
//   get() {
//     return this;
//   }
// });
// var o = foo('self');
// console.log(Object.keys(o));

// 构造函数
// var fun = new Function ("fi", "se = fi", "return fi + se")
// console.log(fun(1,2))

// 获取函数名称
// function createName() {}
// var funName = createName
// console.log(funName.name)





// var n = 40,x = 15,y = 30;
// var nData = '1000 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13 1000 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13'

// function personNum(n, x, y) {
//   if(n >= 2*x && n <= 2*y) {
//     return true
//   }
//   return false
// }

// if(personNum(n, x, y)){
//   var nDatas = nData.split(' ')
//   nDatas.forEach((item, index, arr) => {
//     arr[index] = parseInt(item)
//   })
//   nDatas = nDatas.sort((a,b) => {
//     return b - a
//   })
//   console.log(nDatas)
//   if((x+y) >= n){
//     console.log(nDatas[n-x])
//   }else {
//     console.log(nDatas[y])
//   }
// }else{
//   console.log('-1')
// }

// 手写foreach
// if(!Array.prototype.myEach){
// 	Array.prototype.myEach = function(callback,thisArg){
// 		var T ,k;
		
// 		var O = Object(this);
//     console.log(this)
//     console.log(Object(this))
// 		var len = O.length
		
// 		if(arguments.length>1){
// 			T = thisArg;
// 		}
		
// 		k = 0;
		
// 		while(k<len){
// 			var kValue;
// 			if(k in O){
// 				kValue = O[k];
// 				callback.call(T,kValue,k,O);
// 			}
// 			k++;
// 		}
// 	}
// }

// let a = [11,22,33,44];
// a.myEach((value,index)=>{
// 	console.log(value,index)
// })

// var obj = {
// 	a: 1,
// 	0: 1,
// 	z: 1,
// 	7: 1,
// 	b: 1,
// 	3: 1
// }
// console.log(Object.getOwnPropertyNames(obj).join(""))

// let hasLengthOf10 = {
// 	[Symbol.replace]: function(value, replacement) {
// 		return value.length === 10 ? replacement : value
// 	}
// }
// let message1 = 'hello world'
// 		message2 = 'hello john'

// let replace1 = message1.replace(hasLengthOf10)
// 		replace2 = message2.replace(hasLengthOf10)

// console.log(replace1)
// console.log(replace2)


// class 继承
// class Rect {
// 	constructor(length, width){
// 		this.length = length
// 		this.width = width
// 	}

// 	getArea() {
// 		return this.length * this.width
// 	}

// 	static create(length, width){
// 		return new Rect(length, width)
// 	}
// }

// class Square extends Rect {

// }

// var rec = Square.create(3, 4)
// console.log(rec.getArea())

// let target = {
// 	name: 'target'
// }

// let proxy = new Proxy(target, {
// 	get(trapTarget, key, receiver) {
// 		debugger
// 		if(!trapTarget[key]){
// 			throw new TypeError('not key!')
// 		}

// 		return Reflect.get(trapTarget, key, receiver)
// 	}
// })


// console.log(proxy.name)
// var data = [
//   {
//     "id": "1",
//     "sub": [
//       {
//         "id": "2",
//         "sub": [
//           {
//             "id": "3",
//             "sub": null
//           },
//           {
//             "id": "4",
//             "sub": [
//               {
//                 "id": "6",
//                 "sub": null
//               }
//             ]
//           },
//           {
//             "id": "5",
//             "sub": null
//           }
//         ]
//       }
//     ]
//   },
//   {
//     "id": "7",
//     "sub": [
//       {
//         "id": "8",
//         "sub": [
//           {
//             "id": "9",
//             "sub": null
//           }
//         ]
//       }
//     ]
//   },
//   {
//     "id": "10",
//     "sub": null
//   }
// ]

// let dataMap = new Map()
// function power(arr, path){
//   if(!arr){
//     arr = data
//   }
//   if(!path){
//     var path = []
//   }
//   for(let i = 0; i <= arr.length - 1;i++){
//     dataMap.set(arr[i].id, path.length > 0 ? [...path,arr[i].id] : [arr[i].id])
//     if(arr[i].sub && arr[i].sub.length > 0){
//       let arrPath = path ? [...path, arr[i].id] : [arr[i].id]
//       power(arr[i].sub, arrPath)
//     }else {
//       continue 
//     }
//   }
// }
// power()
// console.log(dataMap)
// 手动搜索
// let idSearch = '3'
// if(dataMap.has(idSearch)){
//   console.log(dataMap.get(idSearch))
// }else{
//   console.log('不存在！')
// }

function p1() {
  return new Promise((res, rej) => {
    // setTimeout(() => {
      console.log('p1')
    //   res()
    // },1000)
    document.getElementsByClassName('succ1')[0].addEventListener('click', () => {
      console.log('click succ 1 ')
      res()
    })
  })
}
function p2() {
  return new Promise((res, rej) => {
    // setTimeout(() => {
      console.log('p2')
    //   res()
    // },1000)
    document.getElementsByClassName('succ2')[0].addEventListener('click', () => {
      console.log('click succ 2 ')
      res()
    })
  })
}
function p3() {
  return new Promise((res, rej) => {
    // setTimeout(() => {
    //   console.log('p3')
    //   res()
    // },1000)
    res()
  })
}

function p () {
  return p1().then(res => {
    return p2()
  }).then(res => {
    return p3()
  })
}

function callback () {
  console.log('callback')
}

p().then(res => {
  callback()
})